/*
* Copyright 2010 Pavel Kozhin 
*
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
* http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed  under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License.
*
* Author: Pavel Kozhin.
*/

package org.etherframework.behaviour.rules.util
{
	import org.etherframework.behaviour.rules.IRule;
	import org.etherframework.behaviour.rules.core.IChain;
	import org.etherframework.behaviour.rules.core.IChild;
	import org.etherframework.behaviour.rules.core.IControl;
	import org.etherframework.behaviour.rules.events.FeedbackEvent;
	import org.etherframework.core.events.DataEvent;

	[ExcludeClass]
	public final class FeedbackHelper
	{
		// All controls except Sequences which do not have feedbackId attribute or !Sequence.isDocument.
		public static function feedback(target:IControl, event:FeedbackEvent, kind:String):void
		{
			var child:IControl = target;
			var chain:Array = [kind];
			var evt:DataEvent;
			
			if (!child.feedbackId && !(child is IRule) && (child is IChain))
				return;
			
			while (child && child.descriptor.parent)
			{
				if (child.feedbackId || !(child is IChain) || ((child is IChain) && IChain(child).isDocument))
				{
					chain.unshift(child.feedbackId || child.descriptor.className);
				}
				child = child.descriptor.parent;
			}
			
			var handler:IRule = (child is IRule) ? (child as IRule) : (child.descriptor.owner as IRule);
			
			if (handler.feedbackEnabled)
			{
				evt = new DataEvent("flow");
				evt.data = [event, chain, handler.id];
				handler.descriptor.owner.dispatchEvent(evt);
			}
			
		}
	}
}